مشاهده تاریخچه کامیت‌ها

پس از ایجاد چندین کامیت یا کلون کردن یک مخزن با تاریخچه موجود، احتمالاً می‌خواهید به تاریخچه نگاه کنید. ابزار اصلی برای این کار، دستور git log است.

این مثال‌ها از یک پروژه ساده به نام "simplegit" استفاده می‌کنند. برای دریافت پروژه، فرمان زیر را اجرا کنید:

$ git clone https://github.com/schacon/simplegit-progit

زمانی که دستور git log را در این پروژه اجرا کنید، خروجی مشابه زیر را دریافت می‌کنید:

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700

 Change version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700

 Remove unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700

 Initial commit

به طور پیش فرض، بدون هیچ آرگومانی، git log کامیت‌های موجود در آن مخزن را به ترتیب معکوس زمانی نمایش می‌دهد؛ یعنی جدیدترین کامییت‌ها ابتدا نمایش داده می‌شوند. همان طور که می‌بینید، این دستور هر کامیت را با هش SHA-1، نام و ایمیل نویسنده، تاریخ و پیام کامیت فهرست می‌کند.

گزینه‌ها و تنوع زیادی برای دستور git log وجود دارد که به شما کمک می‌کند دقیقا آنچه را که به دنبال آن هستید پیدا کنید. یکی از گزینه‌های مفید، -p یا --patch است که تفاوت‌ها(خروجی patch)ایجاد شده در هر کامیت را نمایش می‌دهد. همچنین می‌توانید تعداد ورودی‌های لاگ نمایش داده شده را محدود کنید، مثلا با استفاده از -2 که فقط دو ورودی آخر را نشان می‌دهد.

$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700

 Change version number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "simplegit"
- s.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
s.summary = "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700

 Remove unnecessary test

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
    end

end
-
-if $0 == __FILE__
- git = SimpleGit.new
- puts git.show
-end

این گزینه همان اطلاعات را نمایش می‌دهد، اما با تفاوت‌های که به‌طور مستقیم پس از هر ورودی قرار دارد. این امر برای باز بینی کد یا مرور سریع آنچه در طول یک سری کامیت‌هایی که یک همکار اضافه کرده، بسییار مفید است. همچنین می‌توانید از مجموعه‌ای از گزینه‌های خلاصه‌سازی با دستور git log استفاده کنید. به عنوان مثال، اگر بخواهید آمار مختصری از هر کامیت مشاهده کنید، می‌توانید از گزینه --stat استفاده کنید:

    $ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700

 Change version number

 Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700

 Remove unnecessary test

 lib/simplegit.rb | 5 -----
1 file changed, 5 deletions(-)

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700

 Initial commit

 README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)

همان طور که مشاهده می‌کنید، گزینه --stat زیر هر ورودی کامیت، فهرستی از فایل‌های اصلاح شده، حذف شده در آن فایل‌ها را چاپ می‌کند. همچنین، خلاصه‌ای از اطلاعات را در انتها ارائه می‌دهد.

گزینه دیگری که واقعاً مفید است، --pretty است. این گزینه خروجی لاگ را به فرمت‌های دیگری غیر از فرمت پیش فرض تغییر می‌دهد. چندین مقدار پیش ساخته برای این گزینه در دسترس است. مقدار one live برای این گزینه هر کامیت را در یک خط نمایش می‌دهد که برای مرور تعداد زیادی کامیت بسیار کاربردی است. علاوه بر این، مقادیر short و full و fuller خروجی را تقریبا در همان فرمت اما با اطلاعات کمتر یا بیشتر، به ترتیب، نشان می‌دهند:

    $ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit

گزینه format در git log به شما این امکان را می‌دهد که فرمت خروجی لاگ را به دلخواه خود تعیین کنید. این ویژگی به خصوص زمانی مفید است که می‌خواهید خروجی را برای پردازش ماشین تولید کنید؛ زیرا با تعیین صریح فرمت، اطمینان دارید که خروجی با به روزرسانی‌های گیت تغییر نخواهد کرد. این امر باعث می‌شود که بتوانید به راحتی خروجی را در برنامه‌ها یا اسکریپت‌های خود استفاده کنید و از ثبات آن مطمئن باشید.

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit

دستور git log --pretty=format گزینه‌های مختلفی برای فرمت کردن خروجی لاگ‌های گیت ارائه می‌دهد.

جدول۱. دستور‌های مفید برای git log --pretty=format

SpecifierDescription
%HCommit hash
%hAbbreviated commit hash
%TTree hash
%tAbbreviated tree hash
%PParent hashes
%pAbbreviated parent hashes
%anAuthor name
%aeAuthor email
%adAuthor date (format respects the --date=option)
%arAuthor date, relative
%cnCommitter name
%ceCommitter email
%cdCommitter date
%crCommitter date, relative
%sSubject

شاید برایتان جالب باشد که تفاوت بین نویسنده و کامیت‌کننده چیست. نویسنده کسی است که به‌طور اولیه اثر را نوشته، در حالی که کامیت‌کننده شخصی است که آخرین بار کار را اعمال کرده است. بنابراین، اگر شما یک پچ به یک پروژه ارسال کنید و یکی از اضای اصلی آن پچ را اعمال کند، هم شما و هم آن عضو اعتبار دریافت می‌کند - شما به عنوان نویسنده و آن عضو به کامیت کننده. در مورد این تفاوت بیشتر در بخش گیت توزیع شده بحث خواهیم کرد.

مقادیر گزینه‌های oneline و format به ویژه با گزینه دیگری از لاگ به نام --graph بسیار مفید هستند. این گزینه یک تمودار ASCII کوچک و زیبا اضافه می‌کند که تاریخچه برنچ و ادغام‌های شما را نشان می‌دهد.

    $ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap* 5e3ee11 Merge branch 'master' of https://github.com/dustin/grit.git
|\
| * 420eac9 Add method for getting the current branch
* | 30e367c Timeout code and tests
* | 5a09431 Add timeout protection to grit
* | e1193f8 Support for heads with slashes in them
|/
* d6016bc Require time for xmlschema
* 11d191e Merge branch 'defunkt' into local

این نوع خروجی با ادامه مباحث مربوط به برنچ‌سازی و ادغام در فصل بعد جالب‌تر خواهد شد.

این‌ها تنها برخی از گزینه‌های ساده برای فرمت‌دهی خروجی در git log هستند و گزینه‌های بیشتری نیز وجود دارد. بخش "گزینه های رایج برای git log " شامل گزینه‌هایی است که تاکنون بررسی کرده‌ایم و همچنین برخی دیگر از گزینه‌های رایج فرمت‌دهی که ممکن است مفید باشند، به همراه توضیحاتی درباره نحوه تغییر خروجی دستور لاگ است.

جدول 2. گزینه های رایج برای git log

OptionDescription
-pShow the patch introduced with each commit.
--statShow statistics for files modified in each commit.
--shortstatDisplay only the changed/insertions/deletions line from the --stat command.
--name-onlyShow the list of files modified after the commit information.
--name-statusShow the list of files affected with added/modified/deleted information.
--abbrev-commitShow only the first few characters of the SHA-1 checksum instead of all 40.
--relative-dateDisplay the date in a relative format (e.g., "2 weeks ago") instead of the full date format.
--graphDisplay an ASCII graph of the branch and merge history beside the log output.
--prettyShow commits in an alternate format. Option values include oneline, short, full, fuller, and format.
--onelineShorthand for --pretty=oneline --abbrev-commit used together.